[レポート] AWS AppSyncでセキュアなGraphQLを構築する #NTA308 #AWSreInvent

[レポート] AWS AppSyncでセキュアなGraphQLを構築する #NTA308 #AWSreInvent

こんにちは、AWS事業本部の荒平(@0Air)です。
AWS re:Invent 2024では、ラスベガスへ現地参加しています!

本エントリでは、参加したBuilder's Sessionの「Build a secure GraphQL with AWS AppSync」について紹介します。

3行まとめ

本記事の内容を要約しました。

  • AppSync、GraphQLに興味がある初心者〜中級者の方が対象
  • 環境をセキュアにするには、Cognitoを利用します
  • リクエストに対し、Cognitoのユーザープールに存在するユーザーであればアクセス許可し、それ以外を不許可とすることでセキュアな環境を構築します

セッション概要

In this session, attendees learn how to use AWS Amplify Studio and AWS AppSync to build a secure and scalable GraphQL API. Start by exploring the benefits of a GraphQL-based architecture and how it can simplify application development. Then dive into a working session where participants create their own GraphQL API, configure authentication and authorization, and deploy it into production in your account.

(訳文)
このセッションでは、AWS Amplify StudioとAWS AppSyncを使用してセキュアでスケーラブルなGraphQL APIを構築する方法を学びます。GraphQLベースのアーキテクチャの利点と、アプリケーション開発を簡素化する方法を理解することから始めます。その後、実際にGraphQL APIを作成し、認証と承認を設定し、各自のアカウントで本番環境にデプロイする実習セッションを行います。

スピーカー

  • Victor Feinman, Solutions Architect, AWS
  • Renu Yadav, Sr. Solutions Architect, Amazon Web Services
  • Sailesh Kadam, Sr. Solution Architect, AWS
  • Joshua Morrison, Sr Leader, Solutions Architectur, Amazon Web Services
  • Jason Polce, Solutions Architect, AWS

※テーブルごとにスピーカーが異なるのですが、私のテーブルはVictorでした

レベル

  • 300 - Advanced

セッション内容

構成のイメージ

このセッションで学べるサービスの構成です。
Snack Exchangeという新しいSaaSの基盤作成を想定したワークショップです。
Appsync+DynamoDBのインフラを整えたあと、Cognitoの認証を追加します。

image-20241203094854014

Snack Databaseは事前に用意されており、データ構造は以下の通りでした。これを参考にワークショップを進めていきます。

{
    "user_id": <User ID>,
    "user_name": <User First Name>,
    "snack_name": <User Favorite Snack>,
    "snack_type": <Type of Snack>
}

GraphQL APIを作成する

AppSyncのコンソールから、新規のAPIを作成します。

image-20241203095617455

スキーマは課題内に提供されていたので、これを作成したAPIに設定します。

image-20241203095737921

type Snack {
  user_id: ID!
  user_name: String!
  snack_name: String!
  snack_type: String!
}

type Query {
  getSnack(user_id: ID!, snack_name: String!): Snack
}

schema {
  query: Query
}

データソース・リゾルバ構成

このままでは動作しないので、DynamoDBをデータソースに指定します。

image-20241203100638590

データソースにDynamoDBを指定したら、リゾルバーが構成できるのでこれを設定します。

image-20241203100942909

リゾルバーには、リゾルバーコードを設定する必要があるので、リクエストマッピングを以下の通り設定します。
(ワークショップで提供されました)

image-20241203130734394

/**
 * Sends a request to the attached data source
 * @param {import('@aws-appsync/utils').Context} ctx the context
 * @returns {*} the request
 */
export function request(ctx) {
    return {
        operation: "GetItem",
        key: {
            user_id: { S: ctx.args.user_id },
            snack_name: { S: ctx.args.snack_name }
        }
    };
}

/**
 * Returns the resolver result
 * @param {import('@aws-appsync/utils').Context} ctx the context
 * @returns {*} the result
 */
export function response(ctx) {
    return ctx.result;
}

APIのテスト

AppSyncコンソールから、サンプルクエリを投げて想定通りのレスポンスを得ました。

image-20241203131142650

とってもお手軽にDynamoDBの内容が取得できて色々応用できそうです。
ただ、このままだとパブリックに公開され、誰でも取得できる状態になってしまうので、制限を掛けていきます。

Cognitoでユーザーを追加

ユーザープールを作成し、そこにサンプル用のユーザーを作成します。

image-20241203131400826

AppSync側で認証を追加します。
「Amazon Cognito ユーザープール」を指定し、追加したいユーザープールのIDを入力して保存します。

image-20241203131435836

スキーマを変更

ユーザー認証のため、前手順で設定したスキーマを変更します。

type Snack {
  user_id: ID!
    @aws_cognito_user_pools(cognito_groups: ["EndUsers","Administrators"])
@aws_api_key
  user_name: String!
    @aws_cognito_user_pools(cognito_groups: ["Administrators"])
@aws_api_key
  snack_name: String!
    @aws_cognito_user_pools(cognito_groups: ["EndUsers","Administrators"])
@aws_api_key
  snack_type: String!
    @aws_cognito_user_pools(cognito_groups: ["EndUsers","Administrators"])
@aws_api_key
}

type Query {
  getSnack(user_id: ID!, snack_name: String!): Snack
    @aws_cognito_user_pools(cognito_groups: ["EndUsers","Administrators"])
@aws_api_key
}

schema {
  query: Query
}

CognitoユーザーでAPIを実行

Cognitoに追加したユーザーからAPIを実行してみます。
まずは、Cognitoユーザーでログインします。

image-20241203132102270

ログイン状態で正常にレスポンスが返りました!

image-20241203132141980

ログインをせず実行した場合や、このユーザーに許可されていないクエリを実行すると、ちゃんとエラーが返りました!

image-20241203132204861

感想

AppSyncを触ったことがなかったので、個人的に勉強になるワークショップでした。
Cognitoのユーザープールを指定すれば一瞬で認証が実装できるのでとても楽でいいですね。
セッションはREPEATも編成され、どちらも満席のようなので、日本にも上陸するかもしれません。

これからAPIの開発をしたいエンジニアの方にはオススメしたいセッションでした!

このエントリが誰かの助けになれば幸いです。

それでは、AWS事業本部 コンサルティング部の荒平(@0Air)がお送りしました!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.